Java中存储金额用什么数据类型

您所在的位置:网站首页 java 数据比对 使用什么技术 Java中存储金额用什么数据类型

Java中存储金额用什么数据类型

2024-07-13 06:21| 来源: 网络整理| 查看: 265

文章目录 1. 抛砖引玉2. 加减乘除3. 大小比较4. 小数位数及四舍五入规则

1. 抛砖引玉

在给自己做一个小的Java记账小程序的时候,对金额的处理时必不可少的,一开始选择的是float数据类型,在数据库中,存储金额的数据字段也是float类型。但是在实际操作的过程中,金额会出现失真的问题。

范例1:

public static void main(String[] args){ float num1 = 2015.35f; float num2 = 100.17f; float num3 = num1 - num2; System.out.println(num3); }

结果是:1915.1799,而不是 1915.18,出现失真的问题。

解决办法(X):想办法把数据四舍五入然后存到数据库

出现问题:当多操作了几次后,直接到数据库检查金额是否正确的时候,失真问题依然存在,只不过存在于数据库而不是存在与程序。

原因:float和double都是浮点数, 都有取值范围,都有精度范围。浮点数与通常使用的小数不同,使用中,往往难以确定。常见的问题是定义了一个浮点数,经过一系列的计算,它本来应该等于某个确定值,但实际上并不是,金额必须是完全精确的计算,故不能使用double或者float。

解决办法:

在程序中存储金额的数据类型用:java.math.BigDecimal,在数据库中存储金额的数据类型用:decimal 长度可以自定义,如10,小数点在项目中用的是2,保留2位小数。

此外还要注意的就是默认值,一定写成0.00,不要用默认的NULL,否则在进行加减排序等操作时,会带来转换的麻烦。

SQL: 'amount' DECIMAL(10, 2) DEFAULT 0.00 NOT NULL COMMENT '金额', 2. 加减乘除

两个 BigDecimal 的值不能用 +、-、*、/ 来进行加减乘除

范例2:

public static void main(String[] args){ BigDecimal x = new BigDecimal("1.3"); BigDecimal y = new BigDecimal("2.5"); // 加法 --> 3.8 BigDecimal add = x.add(y); System.out.println(add); // 减法 --> -1.2 BigDecimal subtract = x.subtract(y); System.out.println(subtract); // 乘法 --> 3.25 BigDecimal multiply = x.multiply(y); System.out.println(multiply); // 除法 --> 0.5 ,RoundingMode.HALF_UP 四舍五入 BigDecimal divide = x.divide(y, RoundingMode.HALF_UP); System.out.println(divide); } 3. 大小比较

两个BigDecimal值比较使用compareTo方法,比较结果有-1,0,1,分别表示小于, 等于, 大于

对于0,使用BigDecimal.ZERO表示

范例3:

BigDecimal num = new BigDecimal("-3"); if (num.compareTo(BigDecimal.ZERO) == -1) { System.out.println("num 小于 0"); } else if (num.compareTo(BigDecimal.ZERO) == 1) { System.out.println("num 大于 0"); } else if (num.compareTo(BigDecimal.ZERO) == 0) { System.out.println("num 等于 0"); } 4. 小数位数及四舍五入规则

setScale方法的第一个参数是小数位数,这个示例是保留2位小数,后面是四舍五入规则

范例4:

public static void main(String[] args){ BigDecimal num = new BigDecimal("10.2621684798165165"); System.out.println("原型 = " + num); System.out.println("直接删除多余的小数位 = " + num.setScale(2, BigDecimal.ROUND_DOWN)); System.out.println("进位 = " + num.setScale(2, BigDecimal.ROUND_UP)); System.out.println("四舍五入,碰到5位进位 = " + num.setScale(2, BigDecimal.ROUND_HALF_UP)); System.out.println("四舍五入,碰到5位舍弃 = " + num.setScale(2, BigDecimal.ROUND_HALF_DOWN)); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3